home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
gamesrc
/
arasan_s
/
book.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-06
|
4KB
|
138 lines
// Copyright 1992-3 by Jon Dart. All Rights Reserved.
#include "book.h"
#include "movegen.h"
#include "moveord.h"
#include "util.h"
extern "C"
{
#include <stdlib.h>
#include <time.h>
};
Book::Book()
{
time_t t;
srand((unsigned)time(&t));
bookw = new Book_Reader("BOOKW");
bookb = new Book_Reader("BOOKB");
}
Book::~Book()
{
delete bookb;
delete bookw;
}
Move Book::pick( const Board &b, uint16 node_index,
const Book_Entry &node )
{
Book_Reader *reader = (b.Side() == White) ? bookw : bookb;
unsigned total_weight = 0;
unsigned indx = node_index;
while (indx != INVALID)
{
Book_Entry be;
reader->Fetch(indx, be);
if (be == node)
total_weight += be.recommend;
indx = be.next;
}
if (total_weight == 0)
return Move::NullMove();
unsigned weight = 0;
indx = node_index;
while (indx != INVALID)
{
Book_Entry be;
reader->Fetch(indx,be);
if (be == node && be.recommend > 0)
{
weight += be.recommend;
if ((rand()*(unsigned long)total_weight)/RAND_MAX < weight)
// if (random(total_weight) < weight )
{
Move moves[Move_Generator::MaxMoves];
Move_Generator mg( b, 0, Move::NullMove() );
int n = mg.Generate_Moves(moves,False,True);
assert(be.move_index < n);
return moves[be.move_index];
}
}
indx = be.next;
}
// should never get here
assert(False);
return Move::NullMove();
}
Move Book::book_move( const Board &b )
{
Book_Reader *reader = (b.Side() == White) ? bookw : bookb;
if (!reader->Is_Open())
return Move::NullMove();
unsigned indx = reader->Head(b);
Book_Entry target(b.HashCode(),0,0,0);
while (indx != INVALID)
{
Book_Entry be;
reader->Fetch(indx,be);
if (target == be)
return pick(b, indx, be);
else
indx = be.next;
}
return Move::NullMove();
}
unsigned Book::book_moves( const Board &b, Move *moves,
const unsigned limit)
{
Book_Reader *reader = (b.Side() == White) ? bookw : bookb;
if (!reader->Is_Open())
return 0;
unsigned indx = reader->Head(b);
Book_Entry target(b.HashCode(),0,0,0);
int num_moves = 0;
while (indx != INVALID)
{
Book_Entry be;
reader->Fetch(indx,be);
if ((target == be) && be.recommend)
num_moves++;
indx = be.next;
}
if (num_moves == 0)
return 0;
Move *tmp_moves = new Move[Move_Generator::MaxMoves];
Move_Generator mg( b, 0, Move::NullMove() );
int n = mg.Generate_Moves(tmp_moves,False,True);
int * scores = new int[num_moves];
Move * tmp_moves2 = new Move[num_moves];
indx = reader->Head(b);
num_moves = 0;
while (indx != INVALID)
{
Book_Entry be;
reader->Fetch(indx,be);
if (target == be && be.recommend)
{
assert(be.move_index < n);
tmp_moves2[num_moves] = tmp_moves[be.move_index];
scores[num_moves] = be.recommend;
++num_moves;
}
indx = be.next;
}
Move_Ordering::sort_moves(tmp_moves2,scores,num_moves);
unsigned ret_val = Util::Min(num_moves,limit);
for (int i = 0; i < ret_val; i++)
moves[i] = tmp_moves2[i];
delete [] scores;
delete [] tmp_moves;
delete [] tmp_moves2;
return ret_val;
}